home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 23 / CU Amiga - Super CD-ROM 23 (June 1998).iso / CUCD / Graphics / STIMP_noise / source / pgmmaximin / pgmmaximin.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-01-30  |  4.9 KB  |  241 lines

  1.  
  2. /************************************************************************/
  3. #define OP_NAME      "pgmmaximin"
  4. #define VERSION      "1.01"
  5. #define DATE         "30.01.98"
  6. #define AUTHOR       "Stefan Diener"
  7. /************************************************************************/
  8.  
  9. #include <stdio.h>
  10. #include <stdarg.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <sys/types.h>
  14.  
  15. #include <STIMP/pgm.c>
  16.  
  17. struct PGM_Info source, desti;
  18. static int m, n;
  19. static int edge=1, form=1;
  20.  
  21. unsigned char maximin(unsigned char *feld)
  22. /* bestimmt MAXIMIN aller Teilsequenzen */
  23. {
  24.   unsigned char mami=0, mi;
  25.   int i, j;
  26.  
  27.   for (i=0; i<=edge; i++)   /* Zahl der Teilsequenzen */
  28.   {
  29.     mi=feld[i];
  30.  
  31.     /* MIN dieser Teilsequenz suchen */
  32.     for (j=i+1; j<=i+edge; j++)   /* Zahl der Elemente einer Teilsequenz */
  33.       if (feld[j]<mi) mi=feld[j];
  34.  
  35.     /* vorlaeufiges MAXIMIN merken */
  36.     if (mami<mi) mami=mi;
  37.   }
  38.  
  39.   /* Ergebnis nach aussen uebermitteln */
  40.   return mami;
  41. }
  42.  
  43. void Do_It_plus(void)
  44. {
  45.   int i, x, y, k, l, index;
  46.   unsigned char array[9], maximinx, maximiny;
  47.   unsigned char *src, *dst;
  48.  
  49.   /* Zeiger auf Bilddaten holen */
  50.   src=source.Data;
  51.   dst=desti.Data;
  52.   desti.maxval=source.maxval;
  53.  
  54.   /* fuer jeden Punkt ausser Rand */
  55.   for (y=edge; y<m-edge; y++)
  56.     for (x=edge; x<n-edge; x++)
  57.     {
  58.       /* Position berechnen */
  59.       index=y*n+x;
  60.  
  61.       /* Feld fuellen in x-Richtung */
  62.       i=0;
  63.       for (k=-edge; k<=edge; k++) array[i++]=src[index+k];
  64.       maximinx=maximin(array);
  65.  
  66.       /* Feld fuellen in y-Richtung */
  67.       i=0;
  68.       for (l=-edge; l<=edge; l++) array[i++]=src[index+l*n];
  69.       maximiny=maximin(array);
  70.  
  71.       /* MAXIMIN des Feldes bestimmen */
  72.       dst[(y-edge)*(n-2*edge)+x-edge]=(maximiny>maximinx) ? maximiny : maximinx;
  73.     }
  74. }
  75.  
  76. void Do_It_waage(void)
  77. {
  78.   int i, x, y, k, index;
  79.   unsigned char array[9];
  80.   unsigned char *src, *dst;
  81.  
  82.   /* Zeiger auf Bilddaten holen */
  83.   src=source.Data;
  84.   dst=desti.Data;
  85.   desti.maxval=source.maxval;
  86.  
  87.   /* fuer jeden Punkt ausser Rand */
  88.   for (y=0; y<m; y++)
  89.     for (x=edge; x<n-edge; x++)
  90.     {
  91.       /* Position berechnen */
  92.       index=y*n+x;
  93.       i=0;
  94.  
  95.       /* Feld fuellen in x-Richtung */
  96.       for (k=-edge; k<=edge; k++) array[i++]=src[index+k];
  97.  
  98.       /* MAXIMIN des Feldes bestimmen */
  99.       dst[y*(n-2*edge)+x-edge]=maximin(array);
  100.     }
  101. }
  102.  
  103. void Do_It_senk(void)
  104. {
  105.   int i, x, y, l, index;
  106.   unsigned char array[9];
  107.   unsigned char *src, *dst;
  108.  
  109.   /* Zeiger auf Bilddaten holen */
  110.   src=source.Data;
  111.   dst=desti.Data;
  112.   desti.maxval=source.maxval;
  113.  
  114.   /* fuer jeden Punkt ausser Rand */
  115.   for (y=edge; y<m-edge; y++)
  116.     for (x=0; x<n; x++)
  117.     {
  118.       /* Position berechnen */
  119.       index=y*n+x;
  120.       i=0;
  121.  
  122.       /* Feld fuellen in y-Richtung */
  123.       for (l=-edge; l<=edge; l++) array[i++]=src[index+l*n];
  124.  
  125.       /* MAXIMIN des Feldes bestimmen */
  126.       dst[(y-edge)*n+x]=maximin(array);
  127.     }
  128. }
  129.  
  130. int main(int argc,char **argv)
  131. /* main program */
  132. {
  133.   int i, edgex, edgey;
  134.  
  135.   /* say hello */
  136.   PrintOpening(argc,argv);
  137.  
  138.   /* read the parameters */
  139.   for (i=1; i<argc; i++)
  140.   {
  141.     if ((argv[i][0]=='-') && argv[i][1])
  142.     {
  143.       switch (argv[i][1])
  144.       {
  145.         case '3': edge=1;
  146.                       break;
  147.  
  148.         case '5': edge=2;
  149.                       break;
  150.  
  151.         case '7': edge=3;
  152.                       break;
  153.  
  154.         case '9': edge=4;
  155.                       break;
  156.  
  157.         case 'e': form=3;
  158.                       break;
  159.  
  160.         case 'h': form=2;
  161.                       break;
  162.  
  163.         case 'p': form=1;
  164.                       break;
  165.  
  166.         case 'v': beVerbose=FALSE;
  167.                       break;
  168.  
  169.         default: PrintMessage("Unknown parameter: %s", argv[i]);
  170.                      Hilfe();
  171.                      exit(-1);
  172.                      break;
  173.       }
  174.     }
  175.  
  176.     if (argv[i][0]=='+')
  177.     {
  178.       switch (argv[i][1])
  179.       {
  180.         case 'v': beVerbose=TRUE;
  181.                       break;
  182.  
  183.         default: PrintMessage("Unknown parameter: %s", argv[i]);
  184.                      Hilfe();
  185.                      exit(-1);
  186.                      break;
  187.       }
  188.     }
  189.   }
  190.  
  191.   /* check minimal number of arguments */
  192.   if (argc<3)
  193.   {
  194.     PrintMessage("Not enough arguments !");
  195.     Hilfe();
  196.     exit(-1);
  197.   }
  198.  
  199.   /* check number of file names */
  200.   if (FilenameCount(argc, argv)!=2)
  201.   {
  202.     PrintMessage("Wrong number of file names !");
  203.     Hilfe();
  204.     exit(-1);
  205.   }
  206.  
  207.   if (ReadPGMFile(GetFilename(1,argc,argv),&source)==0)
  208.   {
  209.     m=source.height;
  210.     n=source.width;
  211.  
  212.     /* Aussenraender festlegen */
  213.     edgex=(form==3) ? 0 : edge;
  214.     edgey=(form==2) ? 0 : edge;
  215.  
  216.     if (CreatePGMArray(m-2*edgey, n-2*edgex, &desti)==0)
  217.     {
  218.       PrintMessage("Working ...");
  219.  
  220.       /* MAXIMIN-Filterung */
  221.       switch (form)
  222.       {
  223.         case 1: Do_It_plus();  break;
  224.  
  225.         case 2: Do_It_waage();  break;
  226.  
  227.         case 3: Do_It_senk();  break;
  228.       }
  229.  
  230.       WritePGMFile(GetFilename(2,argc,argv),&desti);
  231.       FreePGMArray(&desti);
  232.     }
  233.  
  234.     FreePGMArray(&source);
  235.   }
  236.  
  237.   PrintClosing();
  238.   exit(0);
  239. }
  240.  
  241.